home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / VOLANT / THREAD.S < prev    next >
Encoding:
Text File  |  1997-02-06  |  7.9 KB  |  351 lines

  1.     OPT    O+
  2.  
  3.      SECTION TEXT
  4.  
  5.     MOVE.L    A7,A5
  6.     MOVE.L    4(A5),A5
  7.     MOVE.L    $C(A5),D0
  8.     ADD.L    $14(A5),D0
  9.     ADD.L    $1C(A5),D0
  10.     ADD.L    #$1000,D0
  11.     MOVE.L    D0,-(SP)
  12.     MOVE.L    A5,-(SP)
  13.     CLR.W    -(SP)
  14.     MOVE.W    #$4A,-(SP)
  15.     TRAP    #1
  16.     LEA    12(SP),SP
  17.     TST.W    D0
  18.     BNE.S    INIT_ERROR
  19.     
  20.     CLR.L    -(SP)
  21.     MOVE.W    #32,-(SP)
  22.     TRAP    #1
  23.     ADDQ.L    #6,SP
  24.     MOVE.L    D0,-(SP)
  25.  
  26.     BSR    T_INSTALL
  27.  
  28.     LEA    TEST,A0
  29.     BSR    T_ADD
  30.  
  31. KK1:    BSR    T_SCHEDULE
  32.     CMPI.B    #$39,$fffffc02.w
  33.     BNE.S    KK1
  34. KK2:    CMPI.B    #$39+$80,$fffffc02.w
  35.     BNE.S    KK2
  36.  
  37.     BSR    T_REMOVE
  38.  
  39.     MOVE.W    #32,-(SP)
  40.     TRAP    #1
  41.     ADDQ.L    #6,SP
  42.  
  43. INIT_ERROR:    CLR.W    -(SP)
  44.     TRAP    #1
  45.  
  46.     RTS
  47.  
  48. TEST:    MOVE.W    #7,D0
  49. .TEST_B:    MOVE.W    D0,-(SP)
  50.  
  51.     MOVE.L    #TEXT,D0
  52.     BSR    PRINT
  53.     
  54.     LEA    TEST1,A0
  55.     BSR    T_ADD
  56.  
  57.     LEA    TEST2,A0
  58.     BSR    T_ADD
  59.  
  60.     LEA    TEST3,A0
  61.     BSR    T_ADD
  62.  
  63.     MOVE.W    (SP)+,D0
  64.     DBRA.W    D0,.TEST_B
  65.     RTS
  66.  
  67.  
  68. TEST1:    MOVE.L    #TEXT1,D0
  69.     BSR    PRINT
  70.     RTS
  71.  
  72. TEST2:    MOVE.L    #TEXT2,D0
  73.     BSR    PRINT
  74.     RTS
  75.  
  76. TEST3:    MOVE.L    #TEXT3,D0
  77.     BSR    PRINT
  78.     RTS
  79.  
  80. *******************************************************************************
  81. * SI VOUS UTILISER CES CODES POUR UN PROGRAMME, PRECISEZ-LE DANS LA
  82. * DOCUMENTATION ET DANS L'EXECUTABLE.
  83. * ET SURTOUT CONTACTER-MOI:
  84. *   Simon  VOLANT
  85. *  2, rue de Mâcon
  86. *    51100 REIMS
  87. *******************************************************************************
  88.  
  89. *******************************************************************************
  90. *
  91. * MK68 (MICRO-KERNEL 68000) LE MULTITACHE SUR 68000!!!
  92. * (C)1996 SIMON VOLANT
  93. *
  94. * PARTIE NOYAU:
  95. * TOUT POUR FAIRE DU MULTITACHE SUR 68000.
  96. * ATTENTION AVEC L'UTILISATION DES APPELS SYSTEMS (TRAP #1).
  97. * LE TOS N'EST PAS FAIT POUR TOURNER EN MULTI-THREAD.
  98. *
  99. * STRUCTURE DE LA ZONE THREAD:
  100. ******************************
  101. * NOM    * OFFSET  * TAILLE * DESCRIPTION
  102. * STACK  *       0 *      4 * POINTEUR DE PILE SP
  103. * KILL   *       4 *      2 * ON DETRUIT LE THREAD LORSQUE KILL EST NEGATIF.
  104. *******************************************************************************
  105. STACK    EQU    0
  106. KILL    EQU    4
  107. MAX_THREAD    EQU    64+1
  108. LOF_THREAD    EQU    1024
  109. KILL_IT    EQU    -1
  110. * TO SCHEDULE:    TRAP    #8
  111. *******************************************************************************
  112. ***** INSTALLATION DU NOYAU MULTITACHE
  113. ***** TIMER A POUR GERER LA PERMUTATION DES TACHES
  114. ***** TRAP #8 POUR PROVOQUER LE SCHEDULER
  115. T_INSTALL:
  116.     PEA    TXT_INSTALL
  117.     MOVE.W    #9,-(SP)
  118.     TRAP    #1
  119.     ADDQ.L    #6,SP
  120. * ON RESERVE DE LA MEMOIRE POUR LE THREAD NUMERO 1:
  121. * IL SE CREE LUI-MEME
  122.     PEA    LOF_THREAD.L
  123.     MOVE.W    #$48,-(SP)
  124.     TRAP    #1
  125.     ADDQ.L    #6,SP
  126.     LEA    P_LIST,A0
  127.     MOVE.L    D0,(A0)
  128.     MOVE.L    #P_LIST,E_LIST
  129. * ON INSTALLE LE TIMER A ET LA TRAP #8
  130. * VOUS POUVEZ VOUS-MEME VARIER LA FREQUENCE
  131.     MOVE.W    #$2700,SR
  132.     MOVE.L    #SCHEDULER,$0A0.W
  133.     MOVE.L    #SCHEDULER,$134.W
  134.     BSET    #5,$FFFFFA07.W
  135.     BSET    #5,$FFFFFA13.W
  136.     MOVE.B    #0,$FFFFFA1F.W
  137.     MOVE.B    #7,$FFFFFA19.W
  138. * ON CONTINUE A CREER LE THREAD PERE
  139.     MOVE.L    (SP)+,A1
  140.     MOVE.L    SP,EX_SP
  141.     MOVE.L    E_LIST,A0
  142.     MOVE.L    (A0),A0
  143.     LEA    LOF_THREAD(A0),SP
  144.     CLR.W    KILL(A0)
  145.     MOVE.L    A1,-(SP)
  146.     MOVE.W    #-1,MUSTEK
  147.     MOVE.W    #$2300,SR
  148. * A PARTIR D'ICI, LE PROGRAMME PEUT-ETRE PREEMPTE!!!
  149.     RTS
  150. TXT_INSTALL:    DC.B    "ALIVE! MK68 IS ALIVE!",13,10,0
  151.     EVEN
  152. *******************************************************************************
  153. ***** DESINITIALISATION
  154. T_REMOVE:
  155.     MOVE.W    #$2700,SR
  156. * ON STOPPE LE TIMER A
  157.     BCLR    #5,$FFFFFA07.W
  158.     BCLR    #5,$FFFFFA13.W
  159.     MOVE.B    #0,$FFFFFA19.W
  160.     MOVE.B    #0,$FFFFFA1F.W
  161. * ON REINSTALLE L'ANCIENNE PILE
  162.     MOVE.L    (SP)+,A1
  163.     MOVE.L    EX_SP,SP
  164.     MOVE.L    A1,-(SP)
  165.     MOVE.W    #$2300,SR
  166.     PEA    TXT_REMOVE
  167.     MOVE.W    #9,-(SP)
  168.     TRAP    #1
  169.     ADDQ.L    #6,SP
  170.     RTS
  171. TXT_REMOVE:    DC.B    "DEAD! MK68 IS DEAD!",13,10,0
  172.     EVEN
  173. *******************************************************************************
  174. ***** INTERRUPT LE SCHEDULER EN LUI-MEME
  175. SCHEDULER:    NOT.L    $FFFF9800.W
  176.     CLR.B    $FFFFFA19.W
  177. * LE THREAD REFUSE DE SE FAIRE INTERROMPRE
  178.     TST.W    MUSTEK
  179.     BEQ.S    .FIN1
  180. * ON SAUVE LE PROCESSUS
  181. .NORMAL:    MOVEM.L    D0-A7,-(SP)
  182.     MOVE.L    E_LIST,A0
  183.     MOVE.L    A0,A1
  184.     MOVE.L    (A1),A1
  185.     MOVE.L    SP,(A1)
  186. * ON PREND LE SUIVANT SUR LA LISTE
  187. .NEXT1:    ADDQ.L    #4,A0
  188. .RETEST:    TST.L    (A0)
  189.     BNE.S    .CONT1
  190.     LEA    P_LIST,A0
  191. * ON TESTE SI ON DOIT LE TUER:
  192. * SUICIDE OU MEUTRE
  193. .CONT1:    MOVE.L    (A0),A1
  194.     TST.W    KILL(A1)
  195.     BPL.S    .CONT2
  196. * SUICIDE OU MEUTRE
  197. .KILL_IT:    MOVE.L    A0,A1
  198. .NEXT2:    ADDQ.L    #4,A1    * ON REMPLACE LA TACHE A TUER
  199.     TST.L    (A1)    * PAR LA DERNIERE DE LA LISTE
  200.     BNE.S    .NEXT2    * OU LE NULL DE FIN DE LISTE
  201.     SUBQ.L    #4,A1
  202.     CLR.L    (A0)
  203.     MOVE.L    (A1),(A0)
  204.     CLR.L    (A1)
  205.     BRA.S    .RETEST
  206. * ICI, ON LANCE LE NOUVEAU PROCESSUS
  207. .CONT2:    MOVE.L    A0,E_LIST
  208.     MOVE.L    (A0),A0
  209.     MOVE.L    (A0),SP
  210.     MOVEM.L    (SP)+,D0-A7
  211. .FIN1:    BTST    #3,$FFFFFA17.W
  212.     BEQ.S    .CT
  213.     MOVE.B    #%11011111,$FFFFFA0F.W
  214. .CT:    NOT.L    $FFFF9800.W
  215.     MOVE.B    #7,$FFFFFA19.W
  216.     RTE
  217. *******************************************************************************
  218. ***** INSTALLER UN NOUVEAU THREAD
  219. * ENTREE: A0 QUI CONTIENT LE POINTEUR SUR LE CODE A EXECUTER PC
  220. * SORTIE: D0 ADRESSE DE LA ZONE DE DONNEES INTERNE
  221. * LORS DE LA RENCONTRE DU RTS, LE PROCESSUS SE SUICIDE
  222. T_ADD:    MOVE.L    A0,A6
  223. * ON ALLOUE DE LA MEMOIRE
  224.     MOVE.L    #LOF_THREAD,D0
  225.     BSR    MALLOC
  226.     MOVE.L    D0,D6
  227. * ON COUPE TOUTE LES ITS
  228.     MOVE.W    MUSTEK,-(SP)
  229.     CLR.W    MUSTEK
  230. * ON AJOUTE LA STRUCTURE A LA LISTE
  231.     LEA    P_LIST,A0
  232. .RETRY:    TST.L    (A0)+
  233.     BNE.S    .RETRY
  234.     SUBQ.L    #4,A0
  235.     MOVE.L    D6,(A0)
  236. * ON CREE LA PILE PAR DEFAUT
  237.     ADD.L    #LOF_THREAD,D6
  238.     MOVE.L    D6,A5
  239.     MOVE.L    #T_SUICIDE,-(A5)
  240.     MOVE.W    #0134,-(A5)
  241.     MOVE.L    A6,-(A5)
  242.     MOVE.W    SR,-(A5)
  243.     MOVEM.L    D0-A7,-(A5)
  244. * ON CREE L'ENTETE
  245.     MOVE.L    (A0),A0
  246.     MOVE.L    A5,(A0)    * STOCK STACK
  247.     CLR.W    KILL(A0)    * NO KILL
  248. * ON REMET LE MUSTEK (JETON SYSTEM)
  249.     MOVE.W    (SP)+,MUSTEK
  250.     RTS
  251. *******************************************************************************
  252. ***** MEURTRE D'UN THREAD
  253. * ENTREE: A0 ADRESSE DE LA ZONE DE DONNEES INTERNE
  254. T_KILL:    MOVE.W    #KILL_IT,KILL(A0)
  255.     BSR.S    T_SCHEDULE
  256.     RTS
  257. *******************************************************************************
  258. ***** SUICIDE D'UN THREAD
  259. T_SUICIDE:    MOVE.L    E_LIST,A0
  260.     MOVE.L    (A0),A0
  261.     MOVE.W    #KILL_IT,KILL(A0)
  262.     BSR.S    T_SCHEDULE
  263.     BRA.S    T_SUICIDE
  264. *******************************************************************************
  265. ***** ON PROVOQUE LA PREEMPTION (PAS BESOIN DE PRENDRE PLUS DE CPU)
  266. T_SCHEDULE:    TRAP    #8
  267.     RTS
  268. *******************************************************************************
  269.  
  270.  
  271. *******************************************************************************
  272. *
  273. * MK68 (MICRO-KERNEL 68000) LE MULTITACHE SUR 68000!!!
  274. * (C)1996 SIMON VOLANT
  275. *
  276. * PARTIE INTERFACE SYSTEM:
  277. * PERMET DE GERER LES APPELS AVEC LE TOS.
  278. * A UTILISER LORSQUE MK68 EST ACTIF!!!!
  279. *
  280. *******************************************************************************
  281. * PRISE DU JETON
  282. * ON MONOPOLISE LE CPU  (POUR PAS QUE QUELQU'UN D'AUTRE NE LE PRENDRE
  283. * ENTRE 2 TESTS). QUE L'ON PEUT RENDRE ENSUITE.
  284. GET_MSYS:    CLR.W    MUSTEK
  285.     TST.W    M_SYSTEM
  286.     BNE.S    .GET_IT
  287.     MOVE.W    #-1,MUSTEK
  288.     BSR.S    T_SCHEDULE
  289.     BRA.S    GET_MSYS
  290. .GET_IT:    CLR.W    M_SYSTEM
  291.     MOVE.W    #-1,MUSTEK
  292.     RTS
  293. *******************************************************************************
  294. * RENDRE LE JETON
  295. PUT_MSYS:    MOVE.W    #-1,M_SYSTEM
  296.     RTS
  297. *******************************************************************************
  298. * FONCTION MALLOC
  299. * D0: NOMBRE D'OCTETS A RESERVER
  300. * INTERFACE AVEC LE SYSTEM
  301. MALLOC:    BSR.S    GET_MSYS
  302.     MOVE.L    D0,-(SP)
  303.     MOVE.W    #$48,-(SP)
  304.     TRAP    #1
  305.     ADDQ.L    #6,SP
  306.     BSR.S    PUT_MSYS
  307.     *BSR.S    T_SCHEDULE
  308.     RTS
  309. *******************************************************************************
  310. * FONCTION PRINT
  311. * D0: TEXT A IMPRIMER
  312. * INTERFACE AVEC LE SYSTEM
  313. PRINT:    BSR.S    GET_MSYS
  314.     MOVE.L    D0,-(SP)
  315.     MOVE.W    #$9,-(SP)
  316.     TRAP    #1
  317.     ADDQ.L    #6,SP
  318.     BSR.S    PUT_MSYS
  319.     BSR.S    T_SCHEDULE
  320.     RTS
  321. *******************************************************************************
  322. * FONCTION WAIT_A_KEY
  323. * INTERFACE AVEC LE SYSTEM
  324. WAIT_A_KEY:    BSR.S    GET_MSYS
  325.     MOVE.W    #7,-(SP)
  326.     TRAP    #1
  327.     ADDQ.L    #2,SP
  328.     BSR.S    PUT_MSYS
  329.     BSR.S    T_SCHEDULE
  330.     RTS
  331. *******************************************************************************
  332. M_SYSTEM:    DC.W    -1
  333. *******************************************************************************
  334.  
  335.  
  336.      SECTION DATA
  337. TEXT1:    DC.B    "1",13,10,0
  338.     EVEN
  339. TEXT2:    DC.B    "2",13,10,0
  340.     EVEN
  341. TEXT3:    DC.B    "3",13,10,0
  342.     EVEN
  343. TEXT:    DC.B    " 5 THREADS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",13,10,0
  344.     EVEN
  345.  
  346.      SECTION BSS
  347. EX_SP:    DS.L    1
  348. MUSTEK:    DS.W    1
  349. E_LIST:    DS.L    1
  350. P_LIST:    DS.L    MAX_THREAD
  351.     EVEN